package LeetCode;

import java.util.Collections;
import java.util.LinkedList;
import java.util.Stack;

public class LC_227_BasicCalculatorII {

    public static void main(String[] args) {

    }

    public class Solution {

        public int calculate(String s) {
            Stack<Integer> stk = new Stack<Integer>();
            int res = 0, num = 0;
            char lastSign = '+';
            char[] cArray = s.toCharArray();

            for (int i = 0; i < cArray.length; i++) {
                char c = cArray[i];
                if (c >= '0' && c <= '9') {
                    num = num * 10 + c - '0';
                }

                if (c == '+' || c == '-' || c == '*' || c == '/' || i == cArray.length - 1) {
                    if (lastSign == '+' || lastSign == '-') {
                        int temp = lastSign == '+' ? num : -num;
                        stk.push(temp);
                        res += temp;
                    }
                    if (lastSign == '*' || lastSign == '/') {
                        res -= stk.peek();
                        int temp = lastSign == '*' ? stk.pop() * num : stk.pop() / num;
                        stk.push(temp);
                        res += temp;
                    }
                    lastSign = c;
                    num = 0;
                }
            }
            return res;
        }

    }

    static class Solution_2 {

        public int calculate(String s) {
            if (s == null || s.length() == 0) return 0;
            LinkedList<Integer> list = new LinkedList<>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (Character.isDigit(c)) {
                    int cur = c - '0';
                    while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))) {
                        cur = cur * 10 + s.charAt(i + 1) - '0';
                        ++i;
                    }
                    if (!list.isEmpty() && (list.peek() == 2 || list.peek() == 3)) {
                        int op = list.pop();
                        int opl = list.pop();
                        int res = 0;
                        if (op == 2) res = opl * cur;
                        else res = opl / cur;
                        list.push(res);
                    } else {
                        list.push(cur);
                    }
                } else if (c != ' ') {
                    switch (c) {
                        case '+':
                            list.push(0);
                            break;
                        case '-':
                            list.push(1);
                            break;
                        case '*':
                            list.push(2);
                            break;
                        case '/':
                            list.push(3);
                            break;
                        default:
                            return -1;
                    }
                }
            }

            if (list.isEmpty()) return 0;
            Collections.reverse(list);
            int res = list.poll();
            while (!list.isEmpty()) {
                int op = list.poll();
                int opr = list.poll();
                if (op == 0) res += opr;
                else res -= opr;
            }
            return res;
        }

    }
}
